home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / tv_towns / tv_towns.asm next >
Assembly Source File  |  1993-07-08  |  17KB  |  928 lines

  1. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  2. ;
  3. ;  超高速版:Towns Real Time effecter & Television
  4. ;
  5. ;      Version 1.04a   (1992/11/27改定)
  6. ;
  7. ;
  8. ;  動作環境:FM-TOWNS  +  TOWNS_OS  or  MS_DOS+DOS|Extender+TBIOS
  9. ;                         v1.1,v2.1
  10. ;
  11. ;  開発言語:386|ASM Tool kit V2.2
  12. ;
  13. ;
  14. ; Program by Ken inoue.(C)1991
  15. ;
  16. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  17.  
  18. .386p
  19.  
  20. EGB        equ    0020h
  21. MB        equ    0040h
  22. MSR        equ    0048h
  23. SB        equ    0080h
  24.  
  25. stack        segment dword stack use32 'stack'
  26. _stack        db    1024*50 dup(?)
  27. stack        ends
  28.  
  29. _data        segment dword public use32 'data'
  30. EGB_WORK    db    1536 dup(0)
  31. MOUSE_WORK    db     4096 dup(0)
  32. _data        ends
  33.  
  34. tv_towns    segment dword public use32 'code'
  35.         assume cs:tv_towns,ds:nothing
  36.  
  37. ;------------------------------------------
  38.         db    '    TV_TOWNS    ' 
  39.         db    '  Version 1.04a '
  40.         db    '                '
  41.         db     'Programmed by   '
  42.         db    '      Ken Inoue.'
  43. ;-------------------------------------------
  44.  
  45. tt_proc        proc    near
  46.         push    ds
  47.         push    es
  48.         push    fs
  49.         push    0110h
  50.         pop    fs
  51.         xor    ah,ah    ; EGB初期化
  52.         lea    edi,EGB_WORK
  53.         mov    ecx,1536
  54.         call    pword ptr fs:[EGB]
  55.  
  56.         mov    ax,0100h; 仮想画面の設定
  57.         mov    dx,9
  58.         call    pword ptr fs:[EGB]
  59.         mov    ax,0101h
  60.         mov    dx,9
  61.         call    pword ptr fs:[EGB]
  62.  
  63.         mov    ax,0500h; 書き込みページの設定(ページ0)
  64.         call    pword ptr fs:[EGB]
  65.  
  66.         mov    ax,0601h; 表次頁の設定(ページ1優先)
  67.         mov    edx,11b
  68.         call    pword ptr fs:[EGB]
  69.  
  70.         mov    ax,1B01h; ディジタイズ指定
  71.         call    pword ptr fs:[EGB]
  72.  
  73.         xor    ah,ah    ; MouseBios初期化
  74.         lea    edi,MOUSE_WORK
  75.         mov    ecx,4096
  76.         call    pword ptr fs:[MB]
  77.         mov    ah,7    ;水平移動範囲指定
  78.         mov    dx,0
  79.         mov    bx,180
  80.         call    pword ptr fs:[MB]
  81.         mov    ah,8    ;垂直移動範囲指定
  82.         mov    dx,0
  83.         mov    bx,120
  84.         call    pword ptr fs:[MB]
  85.  
  86.         mov    ah,44h    ; SoundBios 電子ボリューム初期化
  87.         call    pword ptr fs:[SB]
  88.         mov    ah,43h
  89.         mov    bl,0    ;ライン・イン
  90.         mov    dx,07F7Fh
  91.         call    pword ptr fs:[SB]
  92.  
  93.         mov    ah,0    ; キーボード初期化
  94.         int    90h
  95.         mov    ax,0501h; クリック音無し
  96.         int    90h
  97.  
  98. ;------------------------------------------------------------------------------
  99.  
  100.  
  101. ;------------------------------------------------------------------------------
  102. #init:        mov    ax,1Ch    ; 画面クリア
  103.         mov    ds,ax
  104.         mov    es,ax
  105.         mov    eax,10000000000000001000000000000000b
  106.         mov    edi,40000h
  107.         mov    ebx,360*2/4
  108.         mov    edx,400h-(360*2)
  109.         mov    ebp,240
  110.         align    4
  111. #rep_:        mov    ecx,ebx
  112.         rep    stosd
  113.         add    edi,edx
  114.         dec    ebp
  115.         jne    short #rep_
  116. #key_check:    mov    ax,0901h
  117.         int    90h
  118.         xor    dh,0FFh
  119.         je    short #key_check
  120. #key:        cmp    dl,"0"  ; キ-入力判定
  121.         je    #color_0
  122.         cmp    dl,"1"
  123.         je    #color_8
  124.         cmp    dl,"2"
  125.         je    #color_64
  126.         cmp    dl,"3"
  127.         je    #color_512
  128.         cmp    dl,"4"
  129.         je    #color_4096
  130. ;        cmp    dl,"5"
  131. ;        je    #color_32768
  132.         cmp    dl,"6"
  133.         je    #color_green
  134.         cmp    dl,"7"
  135.         je    #color_red
  136.         cmp    dl,"8"
  137.         je    #color_blue
  138.         cmp    dl,"9"
  139.         je    #color_nega
  140.  
  141.         cmp    dl,"*"
  142.         je    #color_yellow
  143.         cmp    dl,"Y"
  144.         je    #color_yellow
  145.         cmp    dl,"y"
  146.         je    #color_yellow
  147.  
  148.         cmp    dl,"/"
  149.         je    #color_violet
  150.         cmp    dl,"V"
  151.         je    #color_violet
  152.         cmp    dl,"v"
  153.         je    #color_violet
  154.  
  155.         cmp    dl,"+"
  156.         je    #color_skyblue
  157.         cmp    dl,"S"
  158.         je    #color_skyblue
  159.         cmp    dl,"s"
  160.         je    #color_skyblue
  161.  
  162.         cmp    dl,"-"
  163.         je    #jmp_mosaic1
  164.         cmp    dl,"Z"
  165.         je    #jmp_mosaic1
  166.         cmp    dl,"z"
  167.         je    #jmp_mosaic1
  168.  
  169.         cmp    dl,"="
  170.         je    #jmp_mosaic2
  171.         cmp    dl,"X"
  172.         je    #jmp_mosaic2
  173.         cmp    dl,"x"
  174.         je    #jmp_mosaic2
  175.  
  176.         cmp    dl,"."
  177.         je    #jmp_mosaic3
  178.         cmp    dl,"C"
  179.         je    #jmp_mosaic3
  180.         cmp    dl,"c"
  181.         je    #jmp_mosaic3
  182.  
  183.         cmp    dl,"K"
  184.         je    #jt_koma1
  185.         cmp    dl,"k"
  186.         je    #jt_koma1
  187.         cmp    dl,"L"
  188.         je    #jt_koma2
  189.         cmp    dl,"l"
  190.         je    #jt_koma2
  191.         cmp    dl,";"
  192.         je    #jt_koma3
  193.  
  194.         cmp    dl,"I"
  195.         je    #jt_koma21
  196.         cmp    dl,"i"
  197.         je    #jt_koma21
  198.         cmp    dl,"O"
  199.         je    #jt_koma22
  200.         cmp    dl,"o"
  201.         je    #jt_koma22
  202.         cmp    dl,"P"
  203.         je    #jt_koma23
  204.         cmp    dl,"p"
  205.         je    #jt_koma23
  206.  
  207.         cmp    dl,"R"
  208.         je    #reverse
  209.         cmp    dl,"r"
  210.         je    #reverse
  211.  
  212.         cmp    dl,"M"        
  213.         je    monotone    
  214.         cmp    dl,"m"        
  215.         je    monotone    
  216.  
  217.         cmp    dl,""
  218.         je    zoom_up
  219.         cmp    dl,""
  220.         je    zoom_up2
  221.         cmp    dl,""
  222.         je    zoom_up3
  223.  
  224.         cmp    dl,"Q"
  225.         je    multi1
  226.         cmp    dl,"q"
  227.         je    multi1
  228.         cmp    dl,"W"
  229.         je    multi2
  230.         cmp    dl,"w"
  231.         je    multi2
  232.         cmp    dl,"E"
  233.         je    multi3
  234.         cmp    dl,"e"
  235.         je    multi3
  236.  
  237.         cmp    dl,13    ;return_key
  238.         je    quit
  239.         jmp    #init
  240.  
  241. ;===== Table for jump =====
  242. #color_0:    mov    ebp,10000000000000000000000000000000b ;論理演算用
  243.         jmp    draw_main1
  244. #color_8:    mov    ebp,11000010000100001100001000010000b ;論理演算用
  245.         jmp    draw_main1
  246. #color_64:    mov    ebp,11100011000110001110001100011000b ;論理演算用
  247.         jmp    draw_main1
  248. #color_512:    mov    ebp,11110011100111001111001110011100b ;論理演算用
  249.         jmp    draw_main1
  250. #color_4096:    mov    ebp,11111011110111101111101111011110b ;論理演算用
  251.         jmp    draw_main1
  252. ;#color_32768:    mov    ebp,11111111111111111111111111111111b ;論理演算用
  253. ;        jmp    draw_main1
  254. #color_green:    mov    ebp,11111100000000001111110000000000b ;論理演算用
  255.         jmp    draw_main1
  256. #color_red:    mov    ebp,10000011111000001000001111100000b ;論理演算用
  257.         jmp    draw_main1
  258. #color_blue:    mov    ebp,10000000000111111000000000011111b ;論理演算用
  259.         jmp    draw_main1
  260. #color_yellow:    mov    ebp,11111111111000001111111111100000b ;論理演算用
  261.         jmp    draw_main1
  262. #color_violet:    mov    ebp,10000011111111111000001111111111b ;論理演算用
  263.         jmp    draw_main1
  264. #color_skyblue:    mov    ebp,11111100000111111111110000011111b ;論理演算用
  265.         jmp    draw_main1
  266. #color_nega:    mov    ebp,01111111111111110111111111111111b ;論理演算用
  267.         jmp    draw_main2
  268. #jt_koma1:    mov    ebp,2
  269.         jmp    #koma
  270. #jt_koma2:    mov    ebp,6
  271.         jmp    #koma
  272. #jt_koma3:    mov    ebp,12
  273.         jmp    #koma
  274. #jt_koma21:    mov    ebp,6
  275.         jmp    #koma2
  276. #jt_koma22:    mov    ebp,12
  277.         jmp    #koma2
  278. #jt_koma23:    mov    ebp,18
  279.         jmp    #koma2
  280. #jmp_mosaic1:    mov    bx,1919h
  281.         jmp    #mosaic
  282. #jmp_mosaic2:    mov    bx,5F5Fh
  283.         jmp    #mosaic
  284. #jmp_mosaic3:    mov    bx,0FFFFh
  285.         jmp    #mosaic
  286.  
  287. ;===== draw main1 =====
  288.         align    4
  289. draw_main1:    xor    eax,eax        ;画面クリア
  290.         mov    edi,40000h
  291.         mov    esi,400h-(360*2)
  292.         mov    bl,240
  293.         align    4
  294. #clr:
  295.         mov    bh,360/2/15
  296.         align    4
  297. #clrr:
  298.         REPT    15
  299.         and    [edi],ebp
  300.         add    edi,4
  301.         ENDM
  302.         dec    bh
  303.         jne    short #clrr
  304.         add    edi,esi
  305.         dec    bl
  306.         jne    short #clr
  307.  
  308.         call    screen_side_clear
  309.         mov    dx,0458h    ;Packed pixel mask register set.
  310.         mov    al,0
  311.         out    dx,al
  312.         mov    dx,045Ah
  313.         mov    ax,bp
  314.         out    dx,ax
  315.         shr    ebp,16
  316.  
  317.         mov    dx,0458h
  318.         mov    al,1
  319.         out    dx,al
  320.         mov    dx,045Ah
  321.         mov    ax,bp
  322.         out    dx,ax
  323.  
  324.         align    4
  325. #repeat1:    mov    esi,20
  326.         mov    edi,40000h+20
  327.         mov    eax,(360-12)*2/4
  328.         mov    ebx,400h-(360-12)*2
  329.         REPT    240
  330.         mov    ecx,eax
  331.         rep    movsd
  332.         add    esi,ebx
  333.         add    edi,ebx
  334.         ENDM
  335.  
  336.         mov    ax,0901h
  337.         int    90h
  338.         xor    dh,0FFh
  339.         je    #repeat1
  340.         push    dx
  341.  
  342.         mov    dx,0458h    ;Packer pixel mask register clear.
  343.         mov    al,0
  344.         out    dx,al
  345.         mov    dx,045Ah
  346.         mov    ax,0FFFFh
  347.         out    dx,ax
  348.         shr    ebp,16
  349.  
  350.         mov    dx,0458h
  351.         mov    al,1
  352.         out    dx,al
  353.         mov    dx,045Ah
  354.         mov    ax,0FFFFh
  355.         out    dx,ax
  356.  
  357.         pop    dx
  358.         jmp    #key
  359.  
  360.  
  361. ;===== dram main2 =====
  362. draw_main2:    call    screen_side_clear
  363.         align    4
  364. #repeat2:    mov    dl,240
  365.         mov    ecx,400h-(360*2-24)
  366.         mov    esi,20    ;(本当は12だが表示の関係で右へずらす)
  367.         mov    edi,40000h+20
  368.         align    4
  369. #rep1:
  370.         REPT    (360-12)*2/4    ;ここが高速化のポイントだ!
  371.         lodsd
  372.         xor    eax,ebp
  373.         stosd
  374.         ENDM
  375.         add    esi,ecx
  376.         add    edi,ecx
  377.         dec    dl
  378.         jne    #rep1
  379.         mov    ax,0901h
  380.         int    90h
  381.         xor    dh,0FFh
  382.         je    #repeat2
  383.         jmp    #key
  384.  
  385.  
  386. ;===== mosaic =====    
  387.         align    4
  388. #mosaic:    mov    dx,0440h    ;SETTING ZOOM
  389.         mov    al,1Bh
  390.         out    dx,al
  391.         mov    dx,0442h
  392.         mov    ax,bx
  393.         out    dx,ax
  394.         call    clear_screen
  395.  
  396. #mosaic_:    mov    ax,0901h
  397.         int    90h
  398.         xor    dh,0FFh
  399.         je    #mosaic_
  400.         push    dx
  401.         mov    dx,0440h    ;SETTING ZOOM
  402.         mov    al,1Bh
  403.         out    dx,al
  404.         mov    dx,0442h
  405.         mov    ax,0303h
  406.         out    dx,ax
  407.         pop    dx
  408.         jmp    #key
  409.  
  410.  
  411. ;===== koma-okuri mode =====
  412.         align    4
  413. #koma:        call    vsync_check
  414.         mov    dx,0440h    ;SETTING CTRL0
  415.         mov    al,28
  416.         out    dx,al
  417.         mov    dx,0442h
  418.         mov    ax,1100000010000101b
  419.         out    dx,ax
  420.  
  421.         call    vsync_check
  422.  
  423.         mov    dx,0440h    ;SETTING CTRL0
  424.         mov    al,28
  425.         out    dx,al
  426.         mov    dx,0442h
  427.         mov    ax,1100000001000101b
  428.         out    dx,ax
  429.  
  430.         mov    ecx,ebp    ; ebp -- wait 
  431. #k_wait:    call    vsync_check
  432.         loop    #k_wait
  433.  
  434.         mov    ax,0901h
  435.         int    90h
  436.         xor    dh,0FFh
  437.         je    #koma
  438.         jmp    #key
  439.  
  440.  
  441. ;===== koma-okuri mode2 =====
  442.         align    4
  443. #koma2:        call    vsync_check
  444.         mov    dx,0440h    ;SETTING CTRL0
  445.         mov    al,28
  446.         out    dx,al
  447.         mov    dx,0442h
  448.         mov    ax,1100000010000101b
  449.         out    dx,ax
  450.  
  451.         mov    ecx,ebp    ; ebp -- wait 
  452. #k_wait2:    call    vsync_check
  453.         loop    #k_wait2
  454.  
  455.         mov    dx,0440h    ;SETTING CTRL0
  456.         mov    al,28
  457.         out    dx,al
  458.         mov    dx,0442h
  459.         mov    ax,1100000001000101b
  460.         out    dx,ax
  461.  
  462.         mov    ecx,ebp    ; ebp -- wait 
  463. #k_wait2_:    call    vsync_check
  464.         loop    #k_wait2_
  465.  
  466.         mov    ax,0901h
  467.         int    90h
  468.         xor    dh,0FFh
  469.         je    #koma2
  470.         jmp    #key
  471.  
  472.  
  473. ;===== Reverse mode =====
  474. #reverse:    call    screen_side_clear
  475.         align    4
  476. #rev:        mov    esi,20
  477.         mov    edi,40000h+20+400h*239
  478.         mov    eax,(360-12)*2/4
  479.         mov    ebx,400h-(360-12)*2
  480.         mov    ebp,400h+(360-12)*2
  481.         mov    dl,240/80
  482.         align    4
  483. #r_rep:
  484.         REPT    80
  485.         mov    ecx,eax
  486.         rep    movsd
  487.         add    esi,ebx
  488.         sub    edi,ebp
  489.         ENDM
  490.         dec    dl
  491.         jne    #r_rep
  492.         mov    ax,0901h
  493.         int    90h
  494.         xor    dh,0FFh
  495.         je    #rev
  496.         jmp    #key
  497.  
  498.  
  499. ;===== monotone screen =====    ; 処理が手抜きでゴメンナサイ(^_^;)
  500. monotone:    call    screen_side_clear
  501.         align    4
  502. #monotone:    mov    ebp,01111100000000000111110000000000b
  503.         align    4
  504. #monotone_:    mov    cx,240*100h+5
  505.         mov    edx,400h-(360*2-24)
  506.         mov    esi,20
  507.         mov    edi,40000h+20
  508.         align    4
  509. #mn_rep0:
  510.         REPT    (360-12)*2/4    ;ここが高速化のポイントだ!
  511.         lodsd
  512.         and    eax,ebp
  513.         mov    ebx,eax
  514.         shr    eax,cl
  515.         xor    eax,ebx
  516.         shr    eax,cl
  517.         xor    eax,ebx
  518.         stosd
  519.         ENDM
  520.         add    esi,edx
  521.         add    edi,edx
  522.         dec    ch
  523.         jne    #mn_rep0
  524.         mov    ax,0901h
  525.         int    90h
  526.         xor    dh,0FFh
  527.         je    #monotone_
  528.         jmp    #key
  529.  
  530.  
  531. ;===== ZOOM UP mode =====
  532.         align    4
  533. zoom_up:    mov    ah,7    ;水平移動範囲指定
  534.         mov    dx,0
  535.         mov    bx,180
  536.         call    pword ptr fs:[MB]
  537.         mov    ah,8    ;垂直移動範囲指定
  538.         mov    dx,0
  539.         mov    bx,120
  540.         call    pword ptr fs:[MB]
  541.         align    4
  542. #zoom_up:    call    pword ptr fs:[MSR]
  543.         mov    ah,03h            ;位置読み取り
  544.         call    pword ptr fs:[MB]
  545.         movzx    eax,dx
  546.         movzx    esi,bx
  547.         imul    esi,400h        ;SourceVRAM座標算出
  548.         shl    eax,1
  549.         add    esi,eax
  550.         mov    edi,40000h        ;DestinationVRAM座標(^^;)
  551.  
  552.         mov    ebp,400h-4    ;work
  553.         mov    edx,400h
  554.         mov    ecx,120/2
  555. ;拡大率は、2倍
  556.         align    4
  557. #drawing:    push    ecx
  558.         mov    cl,16
  559.     REPT    2
  560.         REPT    180
  561.         lodsw
  562.         mov    ebx,eax    ;この方が早い
  563.         shl    eax,cl
  564.         mov    ax,bx
  565.         stosd
  566.         add    edi,ebp
  567.         stosd
  568.         sub    edi,edx
  569.         ENDM
  570.         add    esi,400h-180*2
  571.         add    edi,800h-360*2
  572.     ENDM
  573.         pop    ecx
  574.         dec    ecx
  575.         jnz    #drawing
  576.  
  577.         mov    ax,0901h
  578.         int    90h
  579.         xor    dh,0FFh
  580.         je    #zoom_up
  581.         jmp    #key
  582.  
  583.  
  584. ;===== ZOOM UP mode2 =====
  585.         align    4
  586. zoom_up2:    mov    ah,7    ;水平移動範囲指定
  587.         mov    dx,0
  588.         mov    bx,240
  589.         call    pword ptr fs:[MB]
  590.         mov    ah,8    ;垂直移動範囲指定
  591.         mov    dx,0
  592.         mov    bx,160
  593.         call    pword ptr fs:[MB]
  594. #zoom_up2:    call    pword ptr fs:[MSR]
  595.         mov    ah,03h            ;位置読み取り
  596.         call    pword ptr fs:[MB]
  597.         movzx    eax,dx
  598.         movzx    esi,bx
  599.         imul    esi,400h        ;SourceVRAM座標算出
  600.         shl    eax,1
  601.         add    esi,eax
  602.         mov    edi,40000h        ;DestinationVRAM座標(^^;)
  603.  
  604.         mov    ebp,400h-6    ;work
  605.         mov    edx,400h*2
  606.         mov    ecx,80/2
  607. ;拡大率は、3倍
  608.         align    4
  609. #drawing2:    push    ecx
  610.         mov    cl,16
  611.     REPT    2
  612.         REPT    120
  613.         lodsw
  614.         mov    ebx,eax    ;この方が早い
  615.         shl    eax,cl
  616.         mov    ax,bx
  617.         stosd
  618.         stosw
  619.         add    edi,ebp
  620.         stosd
  621.         stosw
  622.         add    edi,ebp
  623.         stosd
  624.         stosw
  625.         sub    edi,edx
  626.         ENDM
  627.         add    esi,400h-120*2
  628.         add    edi,400h*3-360*2
  629.     ENDM
  630.         pop    ecx
  631.         dec    ecx
  632.         jnz    #drawing2
  633.  
  634.         mov    ax,0901h
  635.         int    90h
  636.         xor    dh,0FFh
  637.         je    #zoom_up2
  638.         jmp    #key
  639.  
  640.  
  641. ;===== ZOOM UP mode3 =====
  642.         align    4
  643. zoom_up3:    mov    ah,7    ;水平移動範囲指定
  644.         mov    dx,0
  645.         mov    bx,270
  646.         call    pword ptr fs:[MB]
  647.         mov    ah,8    ;垂直移動範囲指定
  648.         mov    dx,0
  649.         mov    bx,180
  650.         call    pword ptr fs:[MB]
  651. #zoom_up3:    call    pword ptr fs:[MSR]
  652.         mov    ah,03h            ;位置読み取り
  653.         call    pword ptr fs:[MB]
  654.         movzx    eax,dx
  655.         movzx    esi,bx
  656.         imul    esi,400h        ;SourceVRAM座標算出
  657.         shl    eax,1
  658.         add    esi,eax
  659.         mov    edi,40000h        ;DestinationVRAM座標(^^;)
  660.  
  661.         mov    ebp,400h-8    ;work
  662.         mov    edx,400h*3
  663.         mov    ecx,60
  664. ;拡大率は、4倍
  665.         align    4
  666. #drawing3:    push    ecx
  667.         mov    cl,16
  668.         REPT    90
  669.         lodsw
  670.         mov    ebx,eax    ;この方が早い
  671.         shl    eax,cl
  672.         mov    ax,bx
  673.         stosd
  674.         stosd
  675.         add    edi,ebp
  676.         stosd
  677.         stosd
  678.         add    edi,ebp
  679.         stosd
  680.         stosd
  681.         add    edi,ebp
  682.         stosd
  683.         stosd
  684.         sub    edi,edx
  685.         ENDM
  686.         add    esi,400h-90*2
  687.         add    edi,400h*4-360*2
  688.         pop    ecx
  689.         dec    ecx
  690.         jnz    #drawing3
  691.  
  692.         mov    ax,0901h
  693.         int    90h
  694.         xor    dh,0FFh
  695.         je    #zoom_up3
  696.         jmp    #key
  697.  
  698.  
  699.  
  700. ;===== multi_screen =====        ;16画面マルチ表示
  701.         align    4
  702. multi1:        mov    ebx,6            ;work    
  703.         mov    edx,400h*4-360*2    ;work
  704.         mov    ebp,400h-(360*2)/4    ;work
  705.  
  706.         mov    eax,40000h    ;destin.VRAM_ADDRESS
  707.         REPT    4
  708.         mov    edi,eax
  709.         mov    esi,0        ;source VRAM_ADDRESS
  710.         push    eax
  711.         call    #multi1s
  712.         pop    eax
  713.         add    eax,0B4h
  714.         ENDM
  715.  
  716.         mov    eax,4F000h    ;destin.VRAM_ADDRESS
  717.         REPT    4
  718.         mov    edi,eax
  719.         mov    esi,0        ;source VRAM_ADDRESS
  720.         push    eax
  721.         call    #multi1s
  722.         pop    eax
  723.         add    eax,0B4h
  724.         ENDM
  725.  
  726.         mov    eax,5E000h    ;destin.VRAM_ADDRESS
  727.         REPT    4
  728.         mov    edi,eax
  729.         mov    esi,0        ;source VRAM_ADDRESS
  730.         push    eax
  731.         call    #multi1s
  732.         pop    eax
  733.         add    eax,0B4h
  734.         ENDM
  735.  
  736.         mov    eax,6D000h    ;destin.VRAM_ADDRESS
  737.         REPT    4
  738.         mov    edi,eax
  739.         mov    esi,0        ;source VRAM_ADDRESS
  740.         push    eax
  741.         call    #multi1s
  742.         pop    eax
  743.         add    eax,0B4h
  744.         ENDM
  745.  
  746.         mov    ax,0901h
  747.         int    90h
  748.         xor    dh,0FFh
  749.         je    multi1
  750.         jmp    #key
  751.         align    4        ;--sub routine start
  752. #multi1s:    mov    ecx,60/5
  753.         align    4
  754. #loop_multi1a:
  755.         REPT    5
  756.         REPT    360/4
  757.         movsw
  758.         add    esi,ebx
  759.         ENDM
  760.         add    esi,edx
  761.         add    edi,ebp
  762.         ENDM
  763.         dec    ecx
  764.         jne    #loop_multi1a
  765.         ret            ;--sub routine end
  766.  
  767.  
  768.  
  769. ;===== multi_screen =====        ;4画面マルチ表示
  770.         align    4
  771. multi2:
  772.         mov    ebx,4            ;work    
  773. ;        mov    ebx,2            ;work    
  774.         mov    edx,400h*2-360*2    ;work
  775.         mov    ebp,400h-(360*2)/2    ;work
  776.         mov    esi,0        ;source VRAM_ADDRESS
  777.         mov    edi,40000h    ;destin.VRAM_ADDRESS
  778.         call    short #multi2s
  779.         mov    esi,0        ;source VRAM_ADDRESS
  780.         mov    edi,40168h    ;destin.VRAM_ADDRESS
  781.         call    short #multi2s
  782.         mov    esi,0        ;source VRAM_ADDRESS
  783.         mov    edi,5E000h    ;destin.VRAM_ADDRESS
  784.         call    short #multi2s
  785.         mov    esi,0        ;source VRAM_ADDRESS
  786.         mov    edi,5E168h    ;destin.VRAM_ADDRESS
  787.         call    short #multi2s
  788.         mov    ax,0901h
  789.         int    90h
  790.         xor    dh,0FFh
  791.         je    multi2
  792.         jmp    #key
  793.         align    4        ;--sub routine start
  794. #multi2s:    mov    ecx,120/4
  795.         call    #loop_multi3a
  796.         ret
  797. ;ルーチン共用(下部)
  798.  
  799.  
  800. ;===== multi_screen =====        ;2画面マルチ表示
  801.         align    4
  802. multi3:
  803.         mov    ebx,4            ;work    
  804. ;        mov    ebx,2            ;work    
  805.         mov    edx,400h-360*2        ;work
  806.         mov    ebp,400h-(360*2)/2    ;work
  807.         mov    esi,0        ;source VRAM_ADDRESS
  808.         mov    edi,40000h    ;destin.VRAM_ADDRESS
  809.         call    short #multi3s
  810.         mov    esi,0        ;source VRAM_ADDRESS
  811.         mov    edi,40168h    ;destin.VRAM_ADDRESS
  812.         call    short #multi3s
  813.         mov    ax,0901h
  814.         int    90h
  815.         xor    dh,0FFh
  816.         je    multi3
  817.         jmp    #key
  818.         align    4        ;--sub routine start
  819. #multi3s:    mov    ecx,240/4
  820.         align    4
  821. #loop_multi3a:
  822.         REPT    4
  823.         REPT    360/2
  824.         mov    eax,[esi]
  825.         stosw
  826.         add    esi,ebx
  827.         ENDM
  828.         add    esi,edx
  829.         add    edi,ebp
  830.         ENDM
  831.         dec    ecx
  832.         jne    #loop_multi3a
  833.         ret            ;--sub routine end
  834.  
  835.  
  836. ;===== screen side clear =====    ; 画面左右の余り部分を未表示にします。
  837.         align    4
  838. screen_side_clear:
  839.         push    ebp
  840.         mov    edi,40000h
  841.         xor    eax,eax
  842.         mov    ebp,(360*2-24)
  843.         mov    edx,400h-360*2
  844.         mov    bl,240
  845.         align    4
  846. #ssc_rep:    
  847.         REPT    20/4
  848.         stosd
  849.         ENDM
  850.         add    edi,ebp
  851.         stosd
  852.         add    edi,edx
  853.         dec    bl
  854.         jne    short #ssc_rep
  855.         pop    ebp
  856.         ret
  857.  
  858. ;===== clear screen =====
  859.         align    4
  860. clear_screen:
  861.         mov    eax,10000000000000001000000000000000b
  862.         mov    edi,40000h
  863.         mov    ebx,360*2/4
  864.         mov    edx,400h-(360*2)
  865.         mov    ebp,240
  866.         align    4
  867. #rep__:        mov    ecx,ebx
  868.         rep    stosd
  869.         add    edi,edx
  870.         dec    ebp
  871.         jne    short #rep__
  872.         ret
  873.  
  874. ;===== vsync check =====
  875.         align    4
  876. vsync_check:
  877. #vsc_1:        mov    dx,0440h
  878.         mov    al,30
  879.         out    dx,al
  880.         add    dx,2
  881.         in    ax,dx
  882.         test    ah,00000100b
  883.         jnz    short #vsc_1
  884.         align    4
  885. #vsc_2:        mov    dx,0440h
  886.         mov    al,30
  887.         out    dx,al
  888.         add    dx,2
  889.         in    ax,dx
  890.         test    ah,00000100b
  891.         jz    short #vsc_2
  892.         ret
  893.  
  894. ;------------------------------------------------------------------------------
  895.  
  896.  
  897. ;------------------------------------------------------------------------------
  898. quit:        lea    edi,EGB_WORK
  899.         mov    ax,0100h    ;ディジタイズOFF
  900.         call    pword ptr fs:[EGB]
  901.  
  902.         mov    ax,0100h
  903.         mov    dx,1
  904.         call    pword ptr fs:[EGB]
  905.         mov    ax,0101h
  906.         mov    dx,1
  907.         call    pword ptr fs:[EGB]
  908.  
  909.         mov    ah,1
  910.         call    pword ptr fs:[MB]
  911.  
  912.         mov    eax,0
  913.         mov    edi,0
  914.         mov    ecx,400h*256*2/4
  915.         rep    stosd
  916.  
  917.         pop    fs
  918.         pop    es
  919.         pop    ds
  920.  
  921.         mov    ax,04c00h    ; Exit back to MS-DOS.
  922.         int    21h        ;
  923. ;------------------------------------------------------------------------------
  924.  
  925. tt_proc        endp
  926. tv_towns    ends
  927.         end    tt_proc
  928.